package org.wdcode.core.factory;

import java.util.concurrent.locks.Lock;

import org.wdcode.common.util.CommonUtil;
import org.wdcode.core.concurrent.LockFactory;

/**
 * 抽象工厂抽象实现
 * @author WD
 * @since JDK6
 * @version 1.0 2010-06-04
 */
public abstract class BaseFactory<E> implements Factory<E> {
	// 对象锁
	protected Lock	lock;
	// 产品
	protected E		e;

	/**
	 * 构造方法
	 */
	public BaseFactory() {
		// 获得锁
		lock = LockFactory.getLock();
	}

	/**
	 * 获得实例 单例模式
	 * @return 获得实例
	 */
	public final E getInstance() {
		// 判断是否为空
		if (CommonUtil.isEmpty(e)) {
			// 同步琐
			lock.lock();
			// 判断是否为空
			if (CommonUtil.isEmpty(e)) {
				// 生成新的实例
				e = newInstance();
			}
			// 解锁
			lock.unlock();
		}
		// 返回
		return e;
	}
}
